#pragma once
#include <memory>
#include <vector>

class Node
{
public:
    Node(int InValue=0,int InIn=0,int InOut=0):Value(InValue),In(InIn),Out(InOut){}
    int Value;
    int In;
    int Out;
    void AddRelativeNode(std::shared_ptr<Node>RelativeNode)
    {
        Nexts.push_back(RelativeNode);
    }
    std::vector<std::shared_ptr<Node>>Nexts;
    std::vector<std::shared_ptr<class Edge>>Edges;
};
using NodePtr = std::shared_ptr<Node>;

class Edge
{
public:
    Edge(int InWeight,NodePtr InFrom,NodePtr InTo):Weight(InWeight),From(InFrom),To(InTo)
    {}
    int Weight;
    NodePtr From;
    NodePtr To;
};
using EdgePtr = std::shared_ptr<Edge>;

class Graph
{
public:
    std::vector<NodePtr>Nodes;
    std::vector<EdgePtr>Edges;
};